package com.triones.api.service;

import com.ruoyi.common.core.domain.PageQuery;
import com.ruoyi.common.core.page.TableDataInfo;
import com.triones.api.entity.BankCardDO;
import com.triones.api.entity.BankCardTypeDO;
import com.triones.api.entity.CustomBankCardStatVO;
import com.triones.api.entity.SandBoxTransactionRequestBodyBO;
import com.triones.api.entity.bo.BankCardBO;
import com.triones.api.entity.bo.BankCardFreezeRecordBO;
import com.triones.api.entity.bo.CardActivateBO;
import com.triones.api.entity.bo.UpdateCardBO;
import com.triones.api.entity.param.*;
import com.triones.api.entity.vo.*;

import java.util.List;
import java.util.Map;

/**
 * 银行卡管理 -接口
 */
public interface BankCardService {

    /**
     * 用户银行统计列表（分页）
     * @param bankCardParams
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomMemberBankCardVO> pageList(BankCardParams bankCardParams, PageQuery pageQuery);

    /**
     * 银行卡列表
     * @param type
     * @param cardStatus
     * @return
     */
    List<BankCardVO> list(Long uid,String type, String cardStatus);

    /**
     * 银行卡申请列表（分页）
     * @param applyBankCardParams
     * @param pageQuery
     * @return
     */
    TableDataInfo<BankCardVO> applyPageList(ApplyBankCardParams applyBankCardParams, PageQuery pageQuery);

    /**
     * 查询卡bin详情
     * @param cardBin
     * @return
     */
    CardBinVO cardBinDetail(String cardBin);

    /**
     * 查询银行卡申请详情
     * @param id
     * @return
     */
    CustomBankCardVO applyDetail(Long id);

    /**
     * 银行卡列表（分页）
     * @param pageQuery
     * @return
     */
    TableDataInfo<BankCardVO> apiPageList(PageQuery pageQuery);

    /**
     * 银行卡申请列表（分页）
     * @param pageQuery
     * @return
     */
    TableDataInfo<BankCardVO> apiApplyPageList(PageQuery pageQuery);

    /**
     * 银行卡详情
     * @param id
     * @return
     */
    CustomBankCardVO apiDetail(Long id);

    /**
     * 检查卡bin信息
     * @param params
     * @return
     */
    boolean checkCardBin(CardBinParams params);

    /**
     * 银行卡申请
     * @param bo
     * @return
     */
    boolean cardApply(BankCardBO bo);

    /**
     * 卡片激活
     * @param bo
     * @return
     */
    boolean cardActivate(CardActivateBO bo);

    /**
     * 卡片冻结/解冻
     * @param bo
     * @return
     */
    boolean freezeCard(BankCardFreezeRecordBO bo);

    /**
     * 卡片交易记录
     * @param params
     * @param pageQuery
     * @return
     */
    TableDataInfo<BankCardTxnVO> cardTnx(BankCardTxnParams params, PageQuery pageQuery);

    /**
     * 查询卡片交易详情
     * @param id
     * @return
     */
    BankCardTxnVO cardTnxDetail(Long id);

    /**
     * 银行卡详情
     * @param id
     * @return
     */
    CustomBankCardDetailVO bankCardDetail(Long id);

    /**
     * 银行卡列表（带消费和取现统计）
     * @param params
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomBankCardStatVO> statList(BankCardStatParams params, PageQuery pageQuery);

    /**
     * 银行卡交易列表
     * @param params
     * @param pageQuery
     * @return
     */
    TableDataInfo<CustomBankCardTxnVO> bankCardTxPageList(CustomBankCardTxnParams params, PageQuery pageQuery);

    /**
     * 测试交易
     * @param bo
     * @return
     */
    Map textTxn(SandBoxTransactionRequestBodyBO bo);

    /**
     * 查询所有银行卡
     * @return
     */
    List<BankCardVO> listAll();

    /**
     * 查询银行卡详情
     * @param cardId
     * @return
     */
    Map getBankCardDetail(String cardId);

    /**
     * 模拟卡更新
     * @return
     */
    Map mockCardUpdate(UpdateCardBO bo);

    /**
     * 卡种列表（分页）
     * @param dto
     * @param pageQuery
     * @return
     */
    TableDataInfo<BankCardTypeVO> typePageList(BankCardTypeDO dto, PageQuery pageQuery);

    /**
     * 检查卡种是否存在
     * @param dto
     * @return
     */
    boolean checkCardSchemeAndCardFormFactor(BankCardTypeDO dto);

    /**
     * 新增卡种
     * @param dto
     */
    void addBankcardType(BankCardTypeDO dto);

    /**
     * 修改卡种
     * @param dto
     */
    void editBankcardType(BankCardTypeDO dto);

    /**
     * 获取详情
     * @param id
     * @return
     */
    BankCardTypeVO getInfo(Long id);

    /**
     * 状态修改
     * @param dto
     * @return
     */
    boolean updateShowStatus(BankCardTypeDO dto);

    /**
     * 删除卡种
     * @param id
     */
    void removeBankcardType(Long id);

    /**
     * 卡种列表
     * @return
     */
    List<BankCardTypeVO> cardTypeList();
}
